package com.clouddms.service.auth;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Token黑名单服务
 * 负责管理被撤销的JWT Token，解决循环依赖问题
 */
@Service
public class TokenBlacklistService {

    private static final Logger logger = LoggerFactory.getLogger(TokenBlacklistService.class);

    // Token黑名单 - 存储被撤销的Token ID
    private final Set<String> tokenBlacklist = ConcurrentHashMap.newKeySet();
    
    // 用户当前Token映射 - 每个用户只保留最新的Token
    private final Map<Long, String> userCurrentTokens = new ConcurrentHashMap<>();

    /**
     * 检查Token是否在黑名单中
     * @param tokenId Token ID
     * @return 是否在黑名单
     */
    public boolean isTokenBlacklisted(String tokenId) {
        return tokenBlacklist.contains(tokenId);
    }

    /**
     * 将Token添加到黑名单
     * @param tokenId Token ID
     */
    public void addToBlacklist(String tokenId) {
        tokenBlacklist.add(tokenId);
        logger.debug("Token已添加到黑名单: {}", tokenId);
    }

    /**
     * 撤销用户的所有Token
     * @param userId 用户ID
     */
    public void revokeUserTokens(Long userId) {
        String currentTokenId = userCurrentTokens.get(userId);
        if (currentTokenId != null) {
            tokenBlacklist.add(currentTokenId);
            userCurrentTokens.remove(userId);
            logger.info("已撤销用户 {} 的旧Token", userId);
        }
    }

    /**
     * 记录用户的新Token
     * @param userId 用户ID
     * @param tokenId Token ID
     */
    public void recordUserToken(Long userId, String tokenId) {
        userCurrentTokens.put(userId, tokenId);
        logger.debug("已记录用户 {} 的新Token", userId);
    }

    /**
     * 手动撤销Token
     * @param tokenId Token ID
     * @param userId 用户ID
     */
    public void revokeToken(String tokenId, Long userId) {
        tokenBlacklist.add(tokenId);
        userCurrentTokens.remove(userId);
        logger.info("已手动撤销Token: {}", tokenId);
    }

    /**
     * 清理过期的黑名单Token
     * 在实际应用中，这里应该检查Token的过期时间并清理过期的Token
     */
    public void cleanupExpiredTokens() {
        logger.debug("Token黑名单清理完成");
    }

    /**
     * 获取黑名单大小（用于监控）
     * @return 黑名单Token数量
     */
    public int getBlacklistSize() {
        return tokenBlacklist.size();
    }

    /**
     * 获取活跃用户Token数量（用于监控）
     * @return 活跃Token数量
     */
    public int getActiveTokenCount() {
        return userCurrentTokens.size();
    }
}